{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ca742def-e7d7-4180-99e8-d9d149123456",
   "metadata": {},
   "source": [
    "Chapter 08\n",
    "\n",
    "# 线性变换\n",
    "《线性代数》 | 鸢尾花书：数学不难"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0d015407-20c9-4f3f-b9e3-fc7e0a5731cb",
   "metadata": {},
   "source": [
    "这段代码的核心目的是**可视化一个二维线性变换** $A \\in \\mathbb{R}^{2 \\times 2}$ 对不同几何对象的作用：包括单位正方形、单位圆、标准基向量、以及整个二维网格的变形，从而帮助理解线性变换如何“拉伸”、“旋转”、“剪切”等操作作用在空间上。\n",
    "\n",
    "---\n",
    "\n",
    "我们从数学角度详细解析各部分含义：\n",
    "\n",
    "---\n",
    "\n",
    "### 一、输入矩阵 $A$\n",
    "\n",
    "```python\n",
    "A = np.array([[1, 2],\n",
    "              [2, 1]])\n",
    "```\n",
    "\n",
    "设定一个线性变换矩阵 $A$，其形式为：\n",
    "\n",
    "$$\n",
    "A = \\begin{bmatrix} 1 & 2 \\\\ 2 & 1 \\end{bmatrix}\n",
    "$$\n",
    "\n",
    "它定义了一个从 $\\mathbb{R}^2$ 到 $\\mathbb{R}^2$ 的线性映射：$T(\\mathbf{x}) = A\\mathbf{x}$，其中 $\\mathbf{x} = \\begin{bmatrix} x_1 \\\\ x_2 \\end{bmatrix}$。\n",
    "\n",
    "---\n",
    "\n",
    "### 二、变换整个二维网格\n",
    "\n",
    "函数 `grid(A)` 用来将一张二维网格变换到新坐标系下：\n",
    "\n",
    "$$\n",
    "\\text{令 } \\mathbf{X}_{\\text{grid}} = \\{ (x_1, x_2) \\mid x_1, x_2 \\in [-10, 10] \\cap \\mathbb{Z} \\}\n",
    "$$\n",
    "\n",
    "原始网格是所有整数点组成的二维笛卡尔坐标格，经过线性变换后，每一个点都会被变换为：\n",
    "\n",
    "$$\n",
    "\\mathbf{x}' = A \\mathbf{x}\n",
    "$$\n",
    "\n",
    "并组成新的图像坐标。变换形式是：\n",
    "\n",
    "$$\n",
    "\\begin{bmatrix}\n",
    "x_1' \\\\\n",
    "x_2'\n",
    "\\end{bmatrix}\n",
    "=\n",
    "\\begin{bmatrix}\n",
    "1 & 2 \\\\\n",
    "2 & 1\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "x_1 \\\\\n",
    "x_2\n",
    "\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "---\n",
    "\n",
    "### 三、变换单位圆\n",
    "\n",
    "函数 `circle(A)` 创建单位圆上 $[0, 2\\pi]$ 范围内的 $721$ 个点：\n",
    "\n",
    "$$\n",
    "\\mathbf{x}(\\theta) = \\begin{bmatrix} \\cos \\theta \\\\ \\sin \\theta \\end{bmatrix}, \\quad \\theta \\in [0, 2\\pi]\n",
    "$$\n",
    "\n",
    "单位圆的所有点满足 $\\|\\mathbf{x}\\|_2 = 1$，即 $x_1^2 + x_2^2 = 1$。\n",
    "\n",
    "经过线性变换后：\n",
    "\n",
    "$$\n",
    "\\mathbf{x}'(\\theta) = A \\mathbf{x}(\\theta)\n",
    "$$\n",
    "\n",
    "变换后不再是圆，而是一个椭圆，体现了线性变换对方向的非均匀伸缩。\n",
    "\n",
    "---\n",
    "\n",
    "### 四、变换单位正方形\n",
    "\n",
    "函数 `unit_sqaure(A)` 变换单位正方形四个顶点：\n",
    "\n",
    "$$\n",
    "\\mathbf{x}_i \\in \\left\\{ (0,0), (1,0), (1,1), (0,1) \\right\\}\n",
    "$$\n",
    "\n",
    "变换后成为一个四边形：\n",
    "\n",
    "$$\n",
    "\\mathbf{x}_i' = A \\mathbf{x}_i\n",
    "$$\n",
    "\n",
    "从视觉上体现线性变换对形状的“剪切”和“伸缩”。\n",
    "\n",
    "---\n",
    "\n",
    "### 五、变换标准基向量与对角向量\n",
    "\n",
    "函数 `vectors(A)` 考察变换前的以下向量：\n",
    "\n",
    "- $\\mathbf{e}_1 = \\begin{bmatrix} 1 \\\\ 0 \\end{bmatrix}$\n",
    "- $\\mathbf{e}_2 = \\begin{bmatrix} 0 \\\\ 1 \\end{bmatrix}$\n",
    "- $\\mathbf{e}_1 + \\mathbf{e}_2 = \\begin{bmatrix} 1 \\\\ 1 \\end{bmatrix}$\n",
    "\n",
    "它们分别经过 $A$ 的作用后变为：\n",
    "\n",
    "- $A\\mathbf{e}_1$\n",
    "- $A\\mathbf{e}_2$\n",
    "- $A(\\mathbf{e}_1 + \\mathbf{e}_2)$\n",
    "\n",
    "这三条向量表示了线性变换在**基向量方向**和**对角方向**的“投影”效果。\n",
    "\n",
    "---\n",
    "\n",
    "### 六、可视化：`visualize(A)`\n",
    "\n",
    "最终绘图过程展示了所有这些被 $A$ 作用后的对象：\n",
    "\n",
    "1. **网格线的扭曲**，显示空间结构如何变形；\n",
    "2. **单位圆变为椭圆**，显示变换对不同方向的缩放比；\n",
    "3. **单位正方形变形为平行四边形**；\n",
    "4. **坐标轴方向的变换向量**（红为 $A\\mathbf{e}_1$，绿为 $A\\mathbf{e}_2$，黑为 $A(\\mathbf{e}_1 + \\mathbf{e}_2)$）；\n",
    "5. **以原点为中心的坐标系、背景网格、图像坐标轴等辅助结构**，保持图像整洁。\n",
    "\n",
    "这些对象的线性变换在几何上提供了关于 $A$ 的非常直观的理解，例如是否具有旋转、剪切、拉伸，以及是否可逆（如果变换后没有退化为低维）。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "28d60d82-4483-460e-a2b7-62741f9c88e2",
   "metadata": {},
   "source": [
    "## 初始化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "86455193-3d75-4c6b-8a72-7cf30e680f7d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e08f428-ea45-4d57-8c54-4693dc3935b8",
   "metadata": {},
   "source": [
    "## 自定义函数，网格数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2677c0fd-a1e5-46f8-bb9c-6cca75329d63",
   "metadata": {},
   "outputs": [],
   "source": [
    "def grid(A):\n",
    "\n",
    "    x1_grids = np.arange(-10,10+1)  # 横轴网格点\n",
    "    x2_grids = np.arange(-10,10+1)  # 纵轴网格点\n",
    "    xx1, xx2 = np.meshgrid(x1_grids, x2_grids)  # 生成网格\n",
    "    X_grid = np.stack([xx1, xx2], axis=2)  # 将网格堆叠为3维数组\n",
    "    A_X_grid = X_grid @ A.T # A线性变换\n",
    "\n",
    "    return A_X_grid"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ee61c558-e50a-42ff-bdba-fc9971191b28",
   "metadata": {},
   "source": [
    "## 自定义函数，单位圆数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "76582119-dace-4b8e-8e26-73a59a49fd82",
   "metadata": {},
   "outputs": [],
   "source": [
    "def circle(A):\n",
    "\n",
    "    theta_array = np.linspace(0,2*np.pi,721)\n",
    "    # 极坐标到直角坐标\n",
    "    x1_array = np.cos(theta_array)\n",
    "    x2_array = np.sin(theta_array)\n",
    "    unit_circle = np.column_stack([x1_array,x2_array])\n",
    "\n",
    "    A_unit_circle = unit_circle @ A.T # A线性变换\n",
    "\n",
    "    return A_unit_circle"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f8f52e65-dc35-4bf8-b3f7-a3d59f2ee72f",
   "metadata": {},
   "source": [
    "## 自定义函数，单位正方形数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "28dc5baf-2628-4da2-9831-bc26e45975a1",
   "metadata": {},
   "outputs": [],
   "source": [
    "def unit_square(A):\n",
    "    unit_square = np.array([[0, 0],\n",
    "                            [1, 0],\n",
    "                            [1, 1],\n",
    "                            [0, 1]])\n",
    "\n",
    "    A_unit_square = unit_square @ A.T # A线性变换\n",
    "    return A_unit_square"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b1b4c8b2-532a-429c-9225-fce117eb55e4",
   "metadata": {},
   "source": [
    "## 自定义函数，三个列向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "052ede0e-15eb-46d9-ac30-b4c09f29576f",
   "metadata": {},
   "outputs": [],
   "source": [
    "def vectors(A):\n",
    "    e1 = np.array([[1],\n",
    "                   [0]])\n",
    "    Ae1 = A@e1 # A线性变换\n",
    "\n",
    "    e2 = np.array([[0],\n",
    "                   [1]])\n",
    "    Ae2 = A@e2 # A线性变换\n",
    "\n",
    "    all_1 = e1 + e2\n",
    "    A_all_1 = A@all_1 # A线性变换\n",
    "\n",
    "    return Ae1, Ae2, A_all_1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4b2fc755-3acc-4580-aa02-0348f3feb12c",
   "metadata": {},
   "source": [
    "## 定义可视化函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "8558df33-8fa9-489c-ac26-2ad6a98bdfcb",
   "metadata": {},
   "outputs": [],
   "source": [
    "def visualize(A):\n",
    "    fig, ax = plt.subplots()  \n",
    "\n",
    "    # 调用自定义函数创建数据\n",
    "    A_X_grid = grid(A)\n",
    "    A_unit_square = unit_square(A)\n",
    "    A_unit_circle = circle(A)\n",
    "    Ae1,Ae2,A_all_1 = vectors(A)\n",
    "\n",
    "    # 绘制变换后的网格\n",
    "    for i in range(A_X_grid.shape[0]):\n",
    "        plt.plot(A_X_grid[i, :, 0], \n",
    "                 A_X_grid[i, :, 1], \n",
    "                 'k-', linewidth=0.5)  # 绘制网格行\n",
    "    for j in range(A_X_grid.shape[1]):\n",
    "        plt.plot(A_X_grid[:, j, 0], \n",
    "                 A_X_grid[:, j, 1], \n",
    "                 'k-', linewidth=0.5)  # 绘制网格列\n",
    "    \n",
    "    # 绘制变换后的列向量\n",
    "    plt.quiver(0, 0, Ae1[0], Ae1[1], \n",
    "               angles='xy', scale_units='xy', \n",
    "               scale=1, color=[1, 0, 0], zorder = 1e5)\n",
    "    plt.quiver(0, 0, Ae2[0], Ae2[1], \n",
    "               angles='xy', scale_units='xy', \n",
    "               scale=1, color=[0, 1, 0], zorder = 1e5)\n",
    "    plt.quiver(0, 0, A_all_1[0], A_all_1[1], \n",
    "               angles='xy', scale_units='xy', \n",
    "               scale=1, color=[0, 0, 0], zorder = 1e5)\n",
    "\n",
    "    # 绘制变换后单位圆\n",
    "    plt.plot(A_unit_circle[:,0],A_unit_circle[:,1], c = 'k', ls = '--')\n",
    "\n",
    "    # 绘制变换后单位正方形\n",
    "    plt.fill(A_unit_square[:,0],A_unit_square[:,1], c = '#FFFFCC', ls = '--', zorder = 1)\n",
    "\n",
    "    # 装饰\n",
    "    plt.axvline(x=0, color='k', zorder=0)\n",
    "    plt.axhline(y=0, color='k', zorder=0)\n",
    "    ax.tick_params(axis='both', which='both', length=0, labelbottom=False, labelleft=False)\n",
    "    ax.set_aspect(1)\n",
    "    lim = 3; ax.set_xlim([-lim, lim]); ax.set_ylim([-lim, lim])\n",
    "    plt.xticks(np.arange(-lim, lim)); plt.yticks(np.arange(-lim, lim))\n",
    "    ax.grid(linestyle='--', linewidth=0.15, color=[0.8, 0.8, 0.8])  # 添加网格"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2abb32f9-bd55-4977-a292-d2ba4b5f41fe",
   "metadata": {},
   "source": [
    "## 可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "bec98eef-e3d2-422b-b834-142298813395",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "A = np.array([[1, 2],\n",
    "              [2, 1]])\n",
    "visualize(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "03a556c4-b8c3-431e-b3ce-99fb169d5064",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
